source $stdenv/setup


export NIX_FIXINC_DUMMY=$NIX_BUILD_TOP/dummy
mkdir $NIX_FIXINC_DUMMY


# libstdc++ needs this; otherwise it will use /lib/cpp, which is a Bad
# Thing.
export CPP="gcc -E"


if test "$noSysDirs" = "1"; then

    # Figure out what extra flags to pass to the gcc compilers being
    # generated to make sure that they use our glibc.
    if test -e $NIX_GCC/nix-support/orig-glibc; then
        glibc=$(cat $NIX_GCC/nix-support/orig-glibc)

        # Ugh.  Copied from gcc-wrapper/builder.sh.  We can't just
        # source in $NIX_GCC/nix-support/add-flags, since that would
        # cause *this* GCC to be linked against the *previous* GCC.
        # Need some more modularity there.
        extraCFlags="-B$glibc/lib -isystem $glibc/include"
        extraLDFlags="-B$glibc/lib -L$glibc/lib -Wl,-s \
          -Wl,-dynamic-linker,$glibc/lib/ld-linux.so.2"

        # Oh, what a hack.  I should be shot for this.  In stage 1, we
        # should link against the previous GCC, but not afterwards.
        # Otherwise we retain a dependency.  However, ld-wrapper,
        # which adds the linker flags for the previous GCC, is also
        # used in stage 2/3.  We can prevent it from adding them by
        # NIX_GLIBC_FLAGS_SET, but then gcc-wrapper will also not add
        # them, thereby causing stage 1 to fail.  So we use a trick to
        # only set the flags in gcc-wrapper.
        hook=$(pwd)/ld-wrapper-hook
        echo "NIX_GLIBC_FLAGS_SET=1" > $hook
        export NIX_LD_WRAPPER_START_HOOK=$hook

        # Use *real* header files, otherwise a limits.h is generated
        # that does not include Glibc's limits.h (notably missing
        # SSIZE_MAX, which breaks the build).
        export NIX_FIXINC_DUMMY=$glibc/include
    fi

    export NIX_EXTRA_CFLAGS=$extraCFlags
    export NIX_EXTRA_LDFLAGS=$extraLDFlags
    export CFLAGS=$extraCFlags
    export CXXFLAGS=$extraCFlags
    export LDFLAGS=$extraLDFlags
fi


preConfigure() {
    
    # Determine the frontends to build.
    langs="c"
    if test -n "$langCC"; then
        langs="$langs,c++"
    fi
    if test -n "$langF77"; then
        langs="$langs,f95"
    fi
    if test -n "$langObjC"; then
        langs="$langs,objc"
    fi

    # Perform the build in a different directory.
    mkdir ../build
    cd ../build

    configureScript=../$sourceRoot/configure
    configureFlags="--enable-languages=$langs --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-multilib --with-gxx-include-dir=${STDCXX_INCDIR} --host=x86_64-apple-darwin10 --build=x86_64-apple-darwin10 --target=x86_64-apple-darwin10"
}


postInstall() {
    # Remove precompiled headers for now.  They are very big and
    # probably not very useful yet.
    find $out/include -name "*.gch" -exec rm -rf {} \; -prune

    # Remove `fixincl' to prevent a retained dependency on the
    # previous gcc.
    rm -rf $out/libexec/gcc/*/*/install-tools
}


postUnpack() {
    mv $libstdcxx/libstdcxx $sourceRoot/
}


STDCXX_INCDIR="$out/include/c++/4.2.1"

genericBuild


echo '-------------------------------------------------------------------------------------------------------------------------'
echo 'libstdcxx'
echo '-------------------------------------------------------------------------------------------------------------------------'

cd ..
pwd

unpackPhase () {
    true
}

patchPhase() {
    true
}

preConfigure() {
    # Perform the build in a different directory.
    mkdir ../build_libstdcxx
    cd ../build_libstdcxx

    ln -s ../build/gcc gcc
    
    configureScript=../$sourceRoot/libstdcxx/configure
    configureFlags="--disable-libstdcxx-pch --disable-libstdcxx-debug --disable-multilib --with-gxx-include-dir=${STDCXX_INCDIR}"
}

postInstall() {
    echo "cp -v ${STDCXX_INCDIR}/*/bits/* ${STDCXX_INCDIR}/bits/"
    cp -v ${STDCXX_INCDIR}/*/bits/* ${STDCXX_INCDIR}/bits/
}

genericBuild

ln -s $out/lib/x86_64 $out/lib64
